--[[
-- Author:      feilong
-- DateTime:    2019-10-30 23:05:48
-- Description: 服务唯一全局变量
-- 为服务提供方便的
-- 

--]]



require("skynet.manager")
local skynet = require("skynet")

--
g = {}
g.hotfix = new("hotfix") --热更功能
g.service_name = "" --服务名

--禁止出现别的全局变量
function g.DisableGlobalVar()
	local __g = _G
	setmetatable(g, {
	    __newindex = function(_, name, value)
	        rawset(__g, name, value)
	    end,
	    __index = function(_, name)
	        return rawget(__g, name)
	    end
	})
	--防止误写全局变量
	setmetatable(__g, {
	    __newindex = function(_, name, value)
	        local msg = "ERROR, please use 'global.%s = value' instead of set global variable! "
	        error(string.format(msg, name), 0)
	    end,
	})
end

function g.AddSingleObj(obj)
	g.hotfix:addObject(obj.__cmodule_name, obj)
	if not obj.class then 
		return 
	end
	local super_class = obj.super
	while super_class do
	    if super_class and super_class.__cmodule_name then
	        --父类模块也加入热更
	        g.hotfix:addObject(super.__cmodule_name, instance)   
	    end       
	    super_class = super_class.super
	end         	
end

--日志对象
function g.Log()
	if not g.logger then 
		g.logger = new("logger")
	end
	return g.logger
end

function g.Message( ... )
	if not g.msg then 
		g.msg = new("message")
	end
	return g.msg
end

--消息派发
function g.MsgDis()
	if not g.msg_dis then 
		g.msg_dis = new("message_dispatch")
	end
	return g.msg_dis
end

--定时器
function g.Timer()
	if not g.timer then 
		g.timer = new("timer")
	end
	return g.timer
end

--fsm有限状态机
function g.FSM( ... )
	if not g.fsm then 
		g.fsm = new("fsm")
	end
	return g.fsm
end

function g.Cfg( ... )
	if not g.cfg then 
		g.cfg = new("config")
	end
	return g.cfg	
end

function g.ErrorCode(...)
	if not g.err_code then 
		g.err_code = new("error_code")
	end
	return g.err_code
end

function g.ErrorDes(err_code)
	if not g.err_des then 
		g.err_des = require("error_description")
	end
	if not err_code then
		return ""
	end
	return g.err_des[err_code] or ""
end


--起动一个服务
function g.StartService(name, init_func)

	g.DisableGlobalVar()
	g.MsgDis()
	g.service_name = name
	if init_func then 
		init_func()
	end		
	skynet.dispatch("lua", g.MsgDis():dispatch())
	skynet.start(function()	
		
		skynet.register(name) --名字长度有限制16个字节，
		if g.cluster_manager then 
			g.cluster_manager:open()
		end		
	end)
end

